package org.yxj.requestlib.i;

import java.util.List;
import java.util.Map;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.http.Body;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.QueryMap;
import rx.Observable;

public interface BaseServer {

    /**
     * 请求
     *  @POST("")
     *  @GET（""）
     *
     *  1、@Path     请求的参数值直接跟在URL后面
     *  2、@Query    表示请求参数，将会以key=value的方式拼接在url后面
     *  3、@QueryMap    表示查询参数，以?key1=value1&key2=value2的形式跟在请求域名后面时使用@Query
     *     @QueryMap 以map的方式直接传入多个键值对的查询参数
     *
     *    【Filed和FieldMap需要FormUrlEncoded【将会自动将请求参数的类型调整为application/x-www-form-urlencoded ，不能用于Get请求】结合使用，否则会抛异常！】
     *  4、@Field    多用于post请求中表单字段，每个@Field后面，对应一对键值对。
     *  5、@FieldMap 以map的方式传入多个键值对，作为body参数
     *
     *
     *  6、@Body   相当于多个@Field，以对象的形式提交
     *  7、@Part   @Multipart  用于文件上传
     *
     *
     *
     *
     *  post  @Body 请求api  传递参数
     *
     *  1、方式一 OKHttp 专门用来构建参数上传的RequestBody子类
     *     FormBody body = new FormBody.Builder()
     *             .add("username","admin")
     *             .add("token","sjdkdjows=dmzkkshf")
     *             .build();
     *
     * 2、方式二  content json字符串
     *     RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), content);
     *
     *
     */




    /**
     * get 请求
     *
     * @param api 接口地址
     * @param map
     * @return
     */
    @GET("{api}")
    Observable<Object> apiByGet(@Path("api") String api, @QueryMap Map<String,Object> map);





    /**
     *
     * 请求api
     *
     * @param api
     * @param body
     *
     * @return
     */
    @POST("{api}")
    Observable<Object> api(@Path("api") String api,
                           @Body RequestBody body);


    /**
     * 请求api
     *
     *
     * @param api
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("{api}")
    Observable<Object> api(@Path("api") String api,
                           @FieldMap Map<String,Object> map);



    /**
     * 文件上传
     *
     *
     *     RequestBody fileRQ = RequestBody.create(MediaType.parse("image/*"), file);
     *     MultipartBody.Part part1 = MultipartBody.Part.createFormData("picture", file.getName(), fileRQ);
     *
     *
     *
     * @param description
     * @param file
     * @return
     */
    @Multipart
    @POST("{api}")
    Observable<ResponseBody> api(@Path("api") String api,
                                 @Part("description") RequestBody description,
                                 @Part MultipartBody.Part file);




    /**
     * 多文件上传
     *
     *
     * RequestBody fileRQ = RequestBody.create(MediaType.parse("image/*"), file);
     * MultipartBody.Part part1 = MultipartBody.Part.createFormData("picture", file.getName(), fileRQ);
     *
     *
     * RequestBody fileTwo = RequestBody.create(MediaType.parse("image/*"), new File(Environment.getExternalStorageDirectory()
     *                 + file.separator + "original.png"));
     * MultipartBody.Part part2=MultipartBody.Part.createFormData("one","one.png",fileTwo);
     *
     *
     * List<MultipartBody.Part> parts=new ArrayList<>();
     * parts.add(part1);
     * parts.add(part2);
     *
     *
     * 调用
     * uploadFiles("/url",parts)
     *
     * @param api
     * @return
     */
    @Multipart
    @POST("{api}")
    Observable<ResponseBody> api(@Path("api") String api,@Part List<MultipartBody.Part> parts);



    @POST("/")
    Observable<ResponseBody> api(@Body RequestBody body);

}
